package com.bjsxt.volatile1;

public class TestVolatile {

    //static boolean flag = true;
    static volatile boolean flag = true;

    public static void main(String[] args) {

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (flag) {

                    //System.out.println("Thread1 is running.");
                    //注释后，线程1会一直运行下去

                    //解决方式：在flag前加上volatile，使线程1能发现主线程对flag的修改
                    //使用volatile后，JVM每次读取flag的值时都会从主存中取，而不会从工作内存中取


                    //Java中，volatile、final、synchronized都是可见的
                    //volatile能保证可见性和有序性，但不保证原子性
                    //synchronized能保证可见性、有序性和原子性
                }
            }
        }).start();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        flag = false;
    }
}
